package com.cicc.springboot.utile;

/**
 * @ClassName FileUploadUtil
 * @Description TODO
 * @Author 转轮王
 * @Date 2024/10/10 11:08
 * @Version 1.0
 */

import com.cicc.springboot.common.dto.R;
import com.cicc.springboot.entity.FileInfoEntity;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID; // 导入UUID类


public class FileUploadUtil {

    private static final String BASE_FILE_PATH = "D:\\springboot\\uploads";

    public static String createFilePath() {
        String dateStr = new SimpleDateFormat("yyyyMMdd").format(new Date());
        String filePathStr = BASE_FILE_PATH + File.separator + dateStr;
        File filePath = new File(filePathStr);

        if (!filePath.exists()) {
            boolean created = filePath.mkdirs(); // 创建目录
            if (created) {
                System.out.println("Directory created: " + filePathStr);
            } else {
                System.err.println("Failed to create directory: " + filePathStr);
            }
        } else {
            System.out.println("Directory already exists: " + filePathStr);
        }

        return filePathStr; // 返回创建的文件路径
    }

    // 将上传的文件保存到指定路径，并返回保存文件路径的列表
    public static List<FileInfoEntity> saveFiles(MultipartFile[] files, List<String> errorMessages) throws IOException {
        List<FileInfoEntity> fileInfoList = new ArrayList<>(); // 创建 FileInfoEntity 列表
        final long MAX_FILE_SIZE = 4 * 1024 * 1024; // 4MB 限制
        String filePathStr = createFilePath(); // 生成文件保存路径

        for (MultipartFile file : files) {
            // 检查文件是否为空
            if (file.isEmpty()) {
                errorMessages.add("文件为空: " + file.getOriginalFilename()); // 收集错误信息
                continue; // 跳过空文件
            }

            // 检查文件大小是否超过限制
            if (file.getSize() > MAX_FILE_SIZE) {
                errorMessages.add("文件过大: " + file.getOriginalFilename()); // 收集错误信息
                continue; // 跳过超过大小限制的文件
            }

            // 获取上传文件的原始文件名
            String originalFilename = file.getOriginalFilename();
            if (originalFilename != null) {
                // 校验文件格式
                if (!FileValidationUtil.isAllowedExtension(originalFilename)) {
                    errorMessages.add("不支持的文件格式: " + originalFilename); // 收集错误信息
                    continue; // 跳过不支持的文件格式
                }

                // 生成新的文件名
                String newFileName = generateNewFileName(originalFilename);
                String savedFilePath = filePathStr + File.separator + newFileName;
                File dest = new File(savedFilePath);

                // 保存文件
                file.transferTo(dest);

                // 创建 FileInfoEntity 对象，并保存文件信息
                FileInfoEntity fileInfoEntity = new FileInfoEntity();
                fileInfoEntity.setFileName(newFileName);
                fileInfoEntity.setFilePath(savedFilePath);
                fileInfoEntity.setFileExtension(getFileExtension(newFileName));
                fileInfoEntity.setFileSize((double) file.getSize() / 1024); // 文件大小，以 KB 为单位

                fileInfoList.add(fileInfoEntity);
            }
        }

        return fileInfoList; // 返回保存文件信息的列表
    }


    // 获取文件扩展名的方法
    private static String getFileExtension(String filename) {
        if (filename.lastIndexOf(".") > 0) {
            return filename.substring(filename.lastIndexOf(".") + 1); // +1 确保返回扩展名而不是点
        }
        return ""; // 返回空字符串，如果没有扩展名
    }

    // 生成新的文件名的方法
    private static String generateNewFileName(String originalFilename) {
        String fileExtension = getFileExtension(originalFilename); // 获取文件扩展名
        String uuid = UUID.randomUUID().toString().replace("-", ""); // 生成 UUID，并去掉连接符
        return uuid + (fileExtension.isEmpty() ? "" : "." + fileExtension); // 返回新的文件名，包含扩展名
    }
}



